<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';

/**
 * Controller para ações de Categoria
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Categoria extends Main {

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema
        $this->verificaLogado();

        //carrega a class necessárias
        $this->load->model('DAOCategoria');
        $this->load->helper('text');

        //Seta propriedades do template
        $this->template->set('title', 'Cadastro de Categoria || ' . $this->title);
        $this->template->set('page_title', 'Cadastro de Categoria');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Não é permitido cadastro duplicado de <span class="bold">CATEGORIAS</span>, então verifique se a categoria a ser inserida não possui cadastro.</p>
                        <p><span class="bold">Só é possível excluir uma CATEGORIA se ele não estiver relacionada com um ITEM (livro, magazine, mídia...).</span></p>
                        <p class="bold"><span class="bold">ALT + N</span> Abre o formulário para cadastrar uma nova Categoria.</p>
                        <p><span class="bold">ESC</span> Fecha o formulário.</p>
                        <p><span class="bold">Duplo clique</span> sobre o registro, abre formulário para edição dos dados.</p>');
    }

    public function index() {
        $this->listar();
    }

    /**
     * Carrega a view com a lista de categorias
     */
    public function listar() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_CATEGORIA);
            // Removendo a variavel 'searchterm' da sessão
            $this->session->unset_userdata('searchterm');

            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby(); // Tratar orderby

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $categorias = $this->DAOCategoria->select_all_categories($init, $total_pagina, $this->order_by, $this->direction);
            $total_rows = $this->DAOCategoria->amount_all_categories();

            // paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "categoria/listar/" . $this->order_by_name . "/" . $this->direction_name . '/' .$total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['categorias'] = $categorias;
            $data['quant_list'] = $total_pagina;

            $this->template->load(NULL, 'categoria_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_category();
        }
    }

    /**
     * Retorna via json a categoria selecionada
     */
    public function get_category() {
        try {
            $this->load->library('form_validation');
            $this->form_validation->set_rules("idCategoria", "Código", "trim|required|min_length[6]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                echo validation_errors();
            } else {
                $categoria = new TOCategoria();
                $categoria->id = $this->input->post('idCategoria', TRUE);

                $data['categoria'] = $this->DAOCategoria->get_category($categoria);
                echo json_encode($data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_category();
        }
    }

    /**
     * Cadastra categoria
     * 
     * @throws ExceptionValidacao
     */
    public function cadastrar() {
        try {
            $this->verificaPermissao(ControleAcesso::CADASTRAR_CATEGORIA);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("nome", "Nome", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("descricao", "Descrição", "trim|min_length[5]|max_length[245]|xss_clean");
            $this->form_validation->set_rules("sequencia", "Sequência", "trim|is_natural|min_length[1]|max_length[2]|xss_clean");
            $this->form_validation->set_rules("status", "Status", "trim|is_natural|min_length[1]|max_length[1]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $categoria = new TOCategoria();
                $categoria->nome = $this->input->post('nome', TRUE);
                $categoria->descricao = $this->input->post('descricao', TRUE);
                $categoria->sequencia = $this->input->post('sequencia', TRUE);
                $categoria->status = $this->input->post('status', TRUE);
                
                $this->DAOCategoria->insert_category($categoria);

                Mensagem::setMensagemSucesso("Categoria: <span class='bold'>" . $categoria->nome. "</span> cadastrada com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Atualiza dados da categoria
     * 
     * @throws ExceptionValidacao
     */
    public function atualizar() {
        try {
            $this->verificaPermissao(ControleAcesso::ATUALIZAR_CATEGORIA);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigo", "Código", "trim|required|is_natural|exact_lenght[6]|xss_clean");
            $this->form_validation->set_rules("nome", "Nome", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("descricao", "Descrição", "trim|min_length[5]|max_length[245]|xss_clean");
            $this->form_validation->set_rules("sequencia", "Sequência", "trim|is_natural|min_length[1]|max_length[2]|xss_clean");
            $this->form_validation->set_rules("status", "Status", "trim|is_natural|min_length[1]|max_length[1]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $categoria = new TOCategoria();
                $categoria->id = $this->input->post('codigo', TRUE);
                $categoria->nome = $this->input->post('nome', TRUE);
                $categoria->descricao = $this->input->post('descricao', TRUE);
                $categoria->sequencia = $this->input->post('sequencia', TRUE);
                $categoria->status = $this->input->post('status', TRUE);
                
                $this->DAOCategoria->update_category($categoria);

                Mensagem::setMensagemSucesso("Categoria: <span class='bold'>" . $categoria->nome . "</span> atualizada com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Exclui categoria
     */
    public function excluir() {
        try {
            $this->verificaPermissao(ControleAcesso::EXCLUIR_CATEGORIA);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigoDelete", "Código", "trim|required|xss_clean");
            $this->form_validation->set_rules("nomeDelete", "Nome", "trim|min_length[2]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $categoria = new TOCategoria();
                $categoria->id = explode(',', $this->input->post('codigoDelete', TRUE)); // Monta array com os ids 
                $categoria->nome = $this->input->post('nomeDelete', TRUE);
                $this->DAOCategoria->delete_category($categoria);

                $categoria->nome != NULL ? Mensagem::setMensagemSucesso("Categoria: <span class='bold'>" . $categoria->nome . "</span> excluída com sucesso!") : Mensagem::setMensagemSucesso("Categorias excluídos com sucesso!");

                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Busca categoria
     */
    public function buscar() {
        try {
            $searchterm = $this->searchtermHandler($this->input->get_post('search_term', TRUE));
            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $categorias = $this->DAOCategoria->search_category($init, $total_pagina, $searchterm, $this->order_by, $this->direction);
            $total_rows = $this->DAOCategoria->amount_search_category($searchterm);

            //paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "categoria/buscar/" . $this->order_by_name . "/" . $this->direction_name . "/". $total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['categorias'] = $categorias;
            $data['quant_list'] = $total_pagina;

            if ($total_rows == 0)
                Mensagem::setMensagem("Nenhum registro foi encontrado para essa pesquisa: <span class='bold'> $searchterm </span>", "aviso");

            $this->template->load(NULL, 'categoria_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->listar();
        }
    }
    
    
    /**
     * Função para selciocionar editora no auto_complete
     */
    public function auto_complete_category() {
        $categoria = new TOCategoria();
        $categoria->nome = $this->input->get('term', TRUE);

        echo json_encode($this->DAOCategoria->suggestion_category($categoria));
    }

    private function view_list_category() {
        $this->template->load(NULL, 'categoria_list');
    }

}
